<?php

Yii::import('application.modules.crm.models._base.BaseContacto');

class Contacto extends BaseContacto {

    const ESTADO_ACTIVO = 'ACTIVO';
    const ESTADO_INACTIVO = 'INACTIVO';

    private $nombre_completo;
    private $nombre_completo_titulo;
    public $numCuentas;
    public $idGrupo;
    public $nombreGrupo;
    public $celular;
    public $telefono;

//    public $celular;

    const PERMISOS_OWNER = 'OWNER';
    const PERMISOS_ALL = 'ALL';

    /**
     * @return Contacto
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    public static function label($n = 1) {
        return Yii::t('app', 'Contacto|Contactos', $n);
    }

    public function gruposToString() {
        $return = '';
        foreach ($this->grupos as $grupo) {
            $return .='&nbsp;&nbsp;' . $grupo->nombre;
        }
        return $return;
    }

    public function getEmail() {
        $comand = Yii::app()->db->createCommand()
                ->select("em.correo as email")
                ->from("email em")
                ->where("em.entidad_tipo = 'CONTACTO' and em.entidad_id = :contacto_id")
                ->order("em.principal DESC")
                ->limit(1);
        $comand->params = array(':contacto_id' => $this->id);
        $email = $comand->queryColumn();
        return (!empty($email)) ? $email[0] : null;
    }

    public function rules() {
        return array_merge(parent::rules(), array(
            array('nombre_completo, nombre_completo_titulo', 'safe', 'on' => 'search'),
//            array('apellido, usuario_creacion_id, permisos, owner_id', 'required'),
        ));
    }

    public function searchParams() {
        return array(
            'nombre_completo',
            'documento',
            'cuenta_id',
            'cargo',
            'departamento',
            'telefono',
            'celular',
            'email_1',
            'owner_id',
        );
    }

//TODO: comertar función @autor Armando Maldonado <amaldonado@tradesystem.com.ec>
    public static function replaceParams($model) {
        return array(
            '[nombre]' => $model->nombre,
            '[apellidos]' => $model->apellido,
            '[titulo]' => $model->titulo,
            '[cargo]' => $model->cargo,
            '[departamento]' => $model->departamento,
            '[celular]' => $model->celular,
//            '[fax]' => $model->fax,
//            '[email_principal]' => $model->email_1,
//            '[email_secundario]' => $model->email_2,
        );
    }

    public static function representingColumn() {
        return 'nombre_completo_titulo';
    }

    public function relations() {
        return array_merge(parent::relations(), array(
            'oportunidades' => array(self::HAS_MANY, 'Oportunidad', 'contacto_id'),
            'cobranzas' => array(self::HAS_MANY, 'Cobranza', 'contacto_id'),
            'notas' => array(self::HAS_MANY, 'Nota', 'entidad_id', 'condition' => 'entidad_tipo = "contacto"'),
            'tareas' => array(self::HAS_MANY, 'Tarea', 'entidad_id', 'condition' => 'entidad_tipo = "contacto"'),
            'eventos' => array(self::HAS_MANY, 'Evento', 'entidad_id', 'condition' => 'entidad_tipo = "contacto"'),
            'sms' => array(self::HAS_MANY, 'Sms', 'contacto_id'),
            'llamadas' => array(self::HAS_MANY, 'Llamada', 'contacto_id'),
            'mails' => array(self::HAS_MANY, 'Mail', 'contacto_id'),
            'incidencias' => array(self::HAS_MANY, 'Incidencia', 'contacto_id'),
            'direccionContactos' => array(self::HAS_MANY, 'Direccion', 'entidad_id', 'condition' => 'entidad_tipo = "' . Crm_Constants::ENTIDAD_TIPO_CONTACTO . '"'),
            'inboxEmails' => array(self::HAS_MANY, 'InboxReciveMail', 'contac_id'),
        ));
    }

    public function scopes() {
        return array(
            'activos' => array(
                'condition' => (Yii::app()->user->isSuperAdmin) ? 't.estado = :estado' : 't.estado = :estado and (t.permisos = :permisos or t.owner_id = :owner_id)',
                'params' => (Yii::app()->user->isSuperAdmin) ? array(
                    ':estado' => self::ESTADO_ACTIVO,
                        ) : array(
                    ':estado' => self::ESTADO_ACTIVO,
                    ':permisos' => self::PERMISOS_ALL,
                    ':owner_id' => Yii::app()->user->id, //Yii::app()->user->isSuperAdmin;
                        ),
            ),
            'con_celular' => array(
                'condition' => 't.celular IS NOT NULL AND t.celular !=""',
            ),
            'con_telefonos' => array(
                'condition' => 't.celular IS NOT NULL or t.fax IS NOT NULL or t.telefono IS NOT NULL ',
            ),
            'con_mail' => array(
                'with' => 'email',
                'condition' => 't.email_1 IS NOT NULL OR t.email_2 IS NOT NULL',
            ),
            'ordenPorNombre' => array(
                'order' => 'concat(t.nombre," ",t.apellido) asc',
            ),
        );
    }

    public function de_cuenta($cuenta_id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 'cuenta_id = :cuenta_id',
                    'params' => array(
                        ':cuenta_id' => $cuenta_id
                    ),
                )
        );
        return $this;
    }

    /**
     * @author Miguel Alba <malba@tradesystem.com.ec>
     * filtro de estado
     * @param type $estado
     * @return \Contactoç
     */
    public function de_estado($estado) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.estado = :estado',
                    'params' => array(':estado' => $estado)
        ));
        return $this;
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array_merge(parent::attributeLabels(), array(
            'nombre_completo' => Yii::t('app', 'Nombre'),
            'documento' => Yii::t('app', 'Cédula / Pasaporte'),
            'email_1' => Yii::t('app', 'Correo Electrónico'),
            'email_2' => Yii::t('app', 'Correo Electrónico Secundario'),
            'owner_id' => Yii::t('app', ' Responsable'),
            'permisos' => Yii::t('app', 'Visible para'),
            'usuario_creacion_id' => Yii::t('app', 'Usuario Creador'),
            'rating' => Yii::t('app', 'Calificación'),
        ));
    }

    /* Own defined Getter function to combine fields */

    public function getNombre_completo() {
        if (!$this->nombre_completo)
            $this->nombre_completo = $this->nombre . ($this->nombre ? ' ' : '') . $this->apellido;
        return $this->nombre_completo;
    }

    public function setNombre_completo($nombre_completo) {
        $this->nombre_completo = $nombre_completo;
        return $this->nombre_completo;
    }

    public function getNombre_completo_titulo() {
        if (!$this->nombre_completo_titulo)
            $this->nombre_completo_titulo = $this->titulo . ($this->titulo ? ' ' : '') . $this->nombre . ($this->nombre ? ' ' : '') . $this->apellido;
        return $this->nombre_completo_titulo;
    }

    public function getPermisosOpciones() {
        return array(
            self::PERMISOS_OWNER => Yii::t('app', 'Usuario Responsable'),
            self::PERMISOS_ALL => Yii::t('app', 'Todos'),
        );
    }

    public function getEmails() {
        $comand = Yii::app()->db->createCommand()
                ->select("distinct(em.correo) as email")
                ->from("email em")
                ->where("em.entidad_tipo = 'CONTACTO'")
                ->order("em.principal");
        $email = $comand->queryColumn();
        return $email;
    }

    /**
     * @author Alex Yepez <ayepez@tradesystem.com.ec>
     * Retorna los contactos segun el parametro de busqueda.
     * @param type $search_value
     * @return type
     */
    public function getListSelect2($search_value = null, $cuenta_id = null, $hasmail = false) {

        $command = Yii::app()->db->createCommand()
                ->select('t.id,CONCAT(IFNULL(CONCAT(t.documento," "),""),IFNULL(CONCAT(t.nombre," "),""),IFNULL(t.apellido,"")) as text')
                ->from('contacto t')
                ->where('t.estado = :estado', array(':estado' => Cuenta::ESTADO_ACTIVO));
        if ($search_value) {
            $command->where("t.documento like '$search_value%' OR CONCAT(IFNULL(CONCAT(t.nombre,' '),''),IFNULL(t.apellido,'')) like '$search_value%'");
        }
        if ($cuenta_id) {
            $command->andWhere('t.cuenta_id = :cuenta_id', array(
                ':cuenta_id' => $cuenta_id,
            ));
        }
        if ($hasmail) {
            $command->join("email em", "em.entidad_id=t.id AND em.entidad_tipo= :entidad_tipo", array(':entidad_tipo' => Crm_Constants::ENTIDAD_TIPO_CONTACTO));
        }
        $command->limit(10);
        return $command->queryAll();
    }

    public function search() {
        $criteria = new CDbCriteria;
        $sort = new CSort;

        $criteria->with = array('cuenta');
        $criteria->join = 'LEFT OUTER JOIN cruge_user ON cruge_user.iduser = t.owner_id';

        $criteria->compare('CONCAT(IFNULL(CONCAT(t.nombre," "),""),IFNULL(t.apellido,""))', $this->nombre_completo, true, 'OR');
        $criteria->compare('t.documento', $this->documento, true, 'OR');
        $criteria->compare('t.cargo', $this->cargo, true, 'OR');
        $criteria->compare('t.departamento', $this->departamento, true, 'OR');
        $criteria->compare('cuenta.nombre', $this->cuenta_id, true, 'OR');
        $criteria->compare('cruge_user.username', $this->owner_id, true, 'OR');


        /* Sort criteria */
        $sort->attributes = array(
            'nombre_completo' => array(
                'asc' => 'CONCAT(IFNULL(CONCAT(t.nombre," "),""),IFNULL(t.apellido,"")) asc',
                'desc' => 'CONCAT(IFNULL(CONCAT(t.nombre," "),""),IFNULL(t.apellido,"")) desc',
            ),
            'owner_id' => array(
                'asc' => 'cruge_user.username asc',
                'desc' => 'cruge_user.username desc',
            ),
            '*',
        );
        $sort->defaultOrder = 'concat(t.nombre," ",t.apellido) asc';

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
            'sort' => $sort,
            'pagination' => array(
                'pageSize' => 10,
            ),
        ));
    }

    public function searchByIdContacto($param) {
        $criteria = new CDbCriteria;
        $criteria->addInCondition('id', $param);
        $criteria->compare('nombre', $this->nombre, true);
        $criteria->compare('apellido', $this->apellido, true);
        $criteria->compare('titulo', $this->titulo, true);
        $criteria->compare('documento', $this->documento, true);
        $criteria->compare('cargo', $this->cargo, true);
        $criteria->compare('departamento', $this->departamento, true);
//        $criteria->compare('telefono', $this->telefono, true);
//        $criteria->compare('celular', $this->celular, true);
//        $criteria->compare('fax', $this->fax, true);
//        $criteria->compare('email_1', $this->email_1, true);
//        $criteria->compare('email_2', $this->email_2, true);
        $criteria->compare('descripcion', $this->descripcion, true);
        $criteria->compare('rating', $this->rating);
        $criteria->compare('estado', $this->estado, true);
        $criteria->compare('usuario_creacion_id', $this->usuario_creacion_id);
        $criteria->compare('usuario_actualizacion_id', $this->usuario_actualizacion_id);
        $criteria->compare('fecha_creacion', $this->fecha_creacion, true);
        $criteria->compare('fecha_actualizacion', $this->fecha_actualizacion, true);
//        $criteria->compare('direccion_principal_id', $this->direccion_principal_id);
//        $criteria->compare('direccion_secundaria_id', $this->direccion_secundaria_id);
        $criteria->compare('cuenta_id', $this->cuenta_id);
        $criteria->compare('permisos', $this->permisos, true);
        $criteria->compare('owner_id', $this->owner_id);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    public function searchByGroup($param) {

        $criteria = new CDbCriteria;
        $criteria->with = array('cuenta');
        $criteria->join = 'LEFT OUTER JOIN cruge_user ON cruge_user.iduser = t.owner_id';

        $criteria->compare('CONCAT(IFNULL(CONCAT(t.nombre," "),""),IFNULL(t.apellido,""))', $this->nombre_completo, true, 'OR');
        $criteria->compare('t.documento', $this->documento, true, 'OR');
        $criteria->compare('t.cargo', $this->cargo, true, 'OR');
        $criteria->compare('t.departamento', $this->departamento, true, 'OR');
        $criteria->compare('t.telefono', $this->telefono, true, 'OR');
        $criteria->compare('t.celular', $this->celular, true, 'OR');
        $criteria->compare('cuenta.nombre', $this->cuenta_id, true, 'OR');
        $criteria->compare('cruge_user.username', $this->owner_id, true, 'OR');
        $criteria->addInCondition('t.id', $param);

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    public function ActualizarEstadoEntidad($entidad_id) {
        $return = Contacto::model()->updateAll(array('estado' => Contacto::ESTADO_INACTIVO,
            'usuario_actualizacion_id' => Yii::app()->user->id,
            'fecha_actualizacion' => Util::FechaActual()), 'cuenta_id = :cuenta_id and estado = :estado', array(':cuenta_id' => $entidad_id,
            ':estado' => Contacto::ESTADO_ACTIVO));
        if ($return) {
            $modelContactos = Contacto::model()->findAll('cuenta_id=:cuenta_id', array('cuenta_id' => $entidad_id));
            foreach ($modelContactos as $contacto) {
                Nota::model()->ActualizarEstadoEntidad('contacto', $contacto->id);
                Tarea::model()->ActualizarEstadoEntidad(Tarea::ENTIDAD_TIPO_CONTACTO, $contacto->id);
                Evento::model()->ActualizarEstadoEntidad(Evento::ENTIDAD_TIPO_CONTACTO, $contacto->id);
            }
        }
        return $return;
    }

    /**
     * total de contactos.
     * @return type
     */
    public function getCountContactos($medioContacto = null, $campania_id = null, $idRol = null) {
        $command = Yii::app()->db->createCommand()
                ->select("count(distinct(c.id)) as total")
                ->from("contacto c");
        if ($campania_id) {
            $command->join("campania_clientes_owner cco", "cco.cliente_id=c.id and cco.campania_id=$campania_id ");
        }
        $command->where("c.estado = :estado");
        $command->params = array(':estado' => self::ESTADO_ACTIVO);
        //todos los que tengan celular
        if ($medioContacto == "SMS") {
            $command->join("telefono te", "te.entidad_id=c.id AND te.entidad_tipo=:entidad_tipo AND te.tipo=:tipo");
            $command->params = array_merge($command->params, array(':entidad_tipo' => Crm_Constants::ENTIDAD_TIPO_CONTACTO, ':tipo' => Telefono::TIPO_CELULAR));
        }
        //todos los que tengan mails
        if ($medioContacto == "EMAIL") {
            $command->join("email em", "em.entidad_id=c.id AND em.entidad_tipo= :entidad_tipo");
            $command->params = array_merge($command->params, array(':entidad_tipo' => Crm_Constants::ENTIDAD_TIPO_CONTACTO));
        }
        if ($idRol) {
            $command->andWhere("cco.owner_id=$idRol");
        }
        $result = $command->queryAll();
//        var_dump($result[0]['total']);
        return $result[0]['total'];
    }

    public function getContactosLotes($limitIni = null, $limitFin = null, $medioContacto = null, $campania_id = null, $idRol = null) {
        $command = Yii::app()->db->createCommand()
                ->select("
                        distinct(c.id) as '[id]',
                        c.nombre as '[nombre]',
                        c.apellido as '[apellidos]',
                        c.titulo as '[titulo]',
                        c.cargo as '[cargo]',
                        c.departamento as '[departamento]',
                        (select te.numero from  telefono te where te.entidad_tipo = 'CONTACTO' AND te.tipo='CELULAR' AND te.entidad_id = c.id order by te.principal desc limit 1) as '[celular]',
                        (select te.numero from  telefono te where te.entidad_tipo = 'CONTACTO' AND te.tipo='CONVENCIONAL TRABAJO' AND te.entidad_id = c.id order by te.principal desc limit 1) as '[telefono]',
                       (select te.numero from  telefono te where te.entidad_tipo = 'CONTACTO' AND te.tipo='FAX TRABAJO' AND te.entidad_id = c.id order by te.principal desc limit 1) as '[fax]',
                       (select em.correo from  email em where em.entidad_tipo = 'CONTACTO' AND em.entidad_id = c.id order by em.principal desc limit 1) as '[email_principal]'
                        ")
                ->from("contacto c");
        $command->where("c.estado = :estado", array(':estado' => self::ESTADO_ACTIVO));
        if ($medioContacto == "SMS") {
            $command->join("telefono te", "te.entidad_id=c.id AND te.entidad_tipo=:entidad_tipo AND te.tipo=:tipo");
            $command->params = array_merge($command->params, array(':entidad_tipo' => Crm_Constants::ENTIDAD_TIPO_CONTACTO, ':tipo' => Telefono::TIPO_CELULAR));
        }
        //todos los que tengan mails
        if ($medioContacto == "EMAIL") {
            $command->join("email em", "em.entidad_id=c.id AND em.entidad_tipo= :entidad_tipo");
            $command->params = array_merge($command->params, array(':entidad_tipo' => Crm_Constants::ENTIDAD_TIPO_CONTACTO));
        }
        //filtro de clientes de campaña
        if ($campania_id) {
            if ($idRol == null) {
                $command->andWhere('c.id in (SELECT cao.cliente_id FROM campania_clientes_owner cao WHERE cao.campania_id = :campania_id  )', array(
                    ':campania_id' => $campania_id
                ));
            } if ($idRol) {
                $command->andWhere('c.id in (SELECT cao.cliente_id FROM campania_clientes_owner cao WHERE cao.campania_id = :campania_id AND cao.owner_id=:owner_id)', array(
                    ':campania_id' => $campania_id,
                    ':owner_id' => $idRol,
                ));
            }
        }
        if ($limitIni && $limitFin) {
            $command->limit($limitFin, $limitIni);
        }
        return ($command->queryAll());
    }

    /**
     * @author Miguel Alba <malba@tradesystem.com.ec>
     * @param type $tipo
     * @return null
     */
    public function getTelefonoTipo($tipo) {
        $modelTelefono = Telefono::model()->findByAttributes(array(
            'entidad_id' => $this->id,
            'entidad_tipo' => "CONTACTO",
            'tipo' => $tipo,
            'principal' => 1
        ));
        if (!$modelTelefono) {
            $modelTelefono = Telefono::model()->findByAttributes(array(
                'entidad_id' => $this->id,
                'tipo' => $tipo,
                'entidad_tipo' => "CONTACTO",
            ));
        }
        if ($modelTelefono) {
            return $modelTelefono->numero;
        } else {
            return null;
        }
    }

    public function getDireccion($tipo) {
        $modelDireccion = Direccion::model()->findByAttributes(array(
            'entidad_id' => $this->id,
            'entidad_tipo' => "CONTACTO",
            $tipo => 1
        ));
        if ($modelDireccion) {
            return $modelDireccion->direccionGoogle;
        } else {
            return null;
        }
    }

    /**
     * retorna los números de un contacto y la cantidad de llamadas realizadas segunel estado
     * @author Alex Yepez <ayepez@tradesystem.com.ec>
     * @param type $contacto_id id del contactp
     * @return array de numeros y llamadas realizadas
     */
    public function getLLamadasNumeros($contacto_id) {
        $command = Yii::app()->db->createCommand(
                "select t.id,t.numero,
(select count(ll.id) from llamada ll where ll.tipo = 'SALIENTE' and ll.estado_llamada = 'CONTACTADO' and ll.numero_llamada = t.numero) as 'Contactado',
(select count(ll.id) from llamada ll where ll.tipo = 'SALIENTE' and ll.estado_llamada = 'NO_CONTACTADO' and ll.numero_llamada = numero) as 'No_Contactado',
(select IF(ll.estado_llamada = ('CONTACTADO') ,'success','danger') from llamada ll where ll.numero_llamada = numero order by ll.fecha_creacion desc limit 1) as 'UltimaContactada',
(select ll.fecha_creacion from llamada ll where ll.numero_llamada = numero and ll.estado_llamada = 'CONTACTADO' order by ll.fecha_creacion desc limit 1) as 'fechaUltimaContactada' 
FROM telefono  as t
where t.entidad_tipo = 'CONTACTO'
AND t.entidad_id=:contacto_id
order by fechaUltimaContactada desc"
        );
        $command->params = array(':contacto_id' => $contacto_id);
        $result = $command->queryAll();
        foreach ($result as $key => $value) {
            if ($value['numero'] == null) {
                unset($result[$key]);
            }
        }
        return $result;
    }

}
